/////////////////////////////////////////////////////////////////////////////
//
//! @file    mip_gx4_imu.h
//! @authors Gregg Carpenter and Nathan Miller
//! @version 1.1
//
//! @description MIP GX4 IMU Specific Structures and Definitions
//
// External dependencies:
//
//  None
//
//!@copyright 2014 Lord Microstrain Sensing Systems.
//
//!@section CHANGES
//!
//
//!@section LICENSE
//!
//! THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING
//! CUSTOMERS WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER
//! FOR THEM TO SAVE TIME. AS A RESULT, LORD MICROSTRAIN SENSING SYSTEMS
//! SHALL NOT BE HELD LIABLE FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES
//! WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT OF SUCH SOFTWARE AND/OR
//! THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONNECTION
//! WITH THEIR PRODUCTS.
//
/////////////////////////////////////////////////////////////////////////////

#ifndef _MIP_GX4_IMU_H
#define _MIP_GX4_IMU_H

////////////////////////////////////////////////////////////////////////////////
//
// Include Files
//
////////////////////////////////////////////////////////////////////////////////

#include "mip.h"

////////////////////////////////////////////////////////////////////////////////
//
// Defines
//
////////////////////////////////////////////////////////////////////////////////

//! @def

////////////////////////////////////////////////////////////////////////////////
// GX4 PARAMETERS
////////////////////////////////////////////////////////////////////////////////

#define GX4_IMU_MODEL_NUMBER 6237

#define GX4_IMU_BASIC_STATUS_SEL 1
#define GX4_IMU_DIAGNOSTICS_STATUS_SEL 2

////////////////////////////////////////////////////////////////////////////////
//
// Structures
//
////////////////////////////////////////////////////////////////////////////////

#pragma pack(1)

///
// Device Basic Status (returned in MIP_REPLY_DESC_3DM_DEVICE_STATUS field
// when status_selector = GX4_BASIC_STATUS_SEL)
///

typedef struct _gx4_imu_basic_status_field {
  u16 device_model;    // always GX4_MODEL_NUMBER
  u8 status_selector;  // always GX4_BASIC_STATUS_SEL

  u32 status_flags;

  // System variables
  u32 system_timer_ms;
} gx4_imu_basic_status_field;

///
// Device Diagnostic Status (returned in MIP_REPLY_DESC_3DM_DEVICE_STATUS field
// when status_selector = GX4_DIAGNOSTICS_STATUS_SEL)
///

typedef struct _gx4_imu_diagnostic_status_field {
  u16 device_model;    // always GX4_IMU_MODEL_NUMBER
  u8 status_selector;  // always GX4_DIAGNOSTICS_STATUS_SEL

  u32 status_flags;

  // System variables
  u32 system_timer_ms;

  // factory settings
  u8 has_mag;
  u8 has_pressure;

  // Sensor parameters
  u16 gyro_range;
  u8 accel_range;
  float mag_range;
  float pressure_range;

  // Temperature
  float temp_degc;
  u32 last_temp_read_ms;
  u8 temp_sensor_error;

  // GPS PPS Stats
  u32 num_gps_pps_triggers;
  u32 last_gps_pps_trigger_ms;

  // Enabled streams
  u8 stream_enabled;

  // Dropped packets (number of packets)
  u32 dropped_packets;

  // Com port stats
  u32 com_port_bytes_written, com_port_bytes_read;
  u32 com_port_write_overruns, com_port_read_overruns;

} gx4_imu_diagnostic_device_status_field;

#pragma pack()

#endif
